-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
경북대Android_정수현_2주차 과제_Step2 #43
base: jsh00325
Are you sure you want to change the base?
경북대Android_정수현_2주차 과제_Step2 #43
Conversation
- SQLite를 사용하기 위해 Contract와 DbHelper를 생성
- Package를 Model, View, ViewModel로 나누어서 보기 편하게 하였다.
- EditText에 입력된 String과 category가 일치하는 데이터를 가져옴
- Data Binding을 이용하여 Adapter를 설계하였다.
- isExistHistory(locationName)를 통해 SQLite에 해당 값이 있는지 확인하는 내부함수
- removeHistory(locationName)를 통해 SQLite에 해당 값이 있는 열을 삭제함
- App Inspection으로 확인한 결과, item을 클릭한 경우 HISTORY table에 정상적으로 아이템이 들어가는 것을 확인함
- getHistory(): SQLite에 저장된 history들을 불러와, List<String>으로 전달하는 메소드 제작
- 마찬가지로 Data Binding을 이용하여 Adapter를 설계하였다.
- History 삭제는 ViewModel에서 사용 가능해야 하므로, private로 지정되어 있던 값을 public으로 열어줌
} | ||
|
||
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { | ||
db?.execSQL("DROP TABLE IF EXISTS ${HistoryContract.TABLE_NAME}") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
db 버전이 업그레이드될때 실행되는 마이그레이션 작업인데
지금은 모든 데이터를 지우고 새로 설정 해주시고 계시네요 ㅎㅎ
지금은 실 서비스가 아니니까 상관 없는데
실제 서비스를 할땐 이런 작업을 유의해야합니다.
앱 업데이트를 했는데 내가 저장해둔 데이터가 날아가면... 무수히 많은 문의를 받을수도 있거든요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"안드로이드 DB(데이터베이스) onUpgrade", tistory / "SQLiteOpenHelper", Android Developers
관련해서 여러 문서들과 블로그들을 찾아보면서, 실제로 onUpgrade()가 호출되는 상황을 이해할 수 있었습니다.
앞으로 업그레이드가 필요한 상황에서는, 기존의 데이터를 새로운 버전으로 마이그레이션을 할 수 있도록 코드를 작성하겠습니다!
oldList[oldItemPosition] == newList[newItemPosition] | ||
|
||
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean = | ||
oldList[oldItemPosition] == newList[newItemPosition] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DiffUtil을 사용 해보셨군요 🎉
지금 구현상태로도 적당히 잘 동작하긴 합니다만, 아직 최적화가 되지 않았습니다.
areItemsTheSame
와 areContentsTheSame
구현 때문인데요
이부분 한번 더 연구 해보시겠어요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
areContentsTheSame()
은 두 객체간의 내용이 같은 경우를 확인하기 위한 함수이고(공식 문서), areItemsTheSame()
은 두 객체의 id값을 비교해서, 정말로 같은 객체인지 확인하기 위한 함수(공식 문서)라고 이해했습니다.
따라서 areItemsTheSame()
의 결과가 true
인 경우에만 areContentsTheSame()
가 호출된다고 이해했습니다.
이 부분을 최적화하기 위해 여러 블로그 글을 봤는데, 대부분의 예제들이 Data Class를 설정한 후 id값을 통해 areItemsTheSame()
를 구현하는 것을 확인하였습니다. 이에 반해 현재 제 코드는 String 타입을 비교하는데, 이러한 경우에는 ===
연산자를 통해서 비교하면 될까요..?
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition] === newList[newItemPosition]
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition] == newList[newItemPosition]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
areContentsTheSame()은 두 객체간의 내용이 같은 경우를 확인하기 위한 함수이고(공식 문서), areItemsTheSame()은 두 객체의 id값을 비교해서, 정말로 같은 객체인지 확인하기 위한 함수(공식 문서)라고 이해했습니다.
정확히 잘 이해하셨습니다 👏
지금처럼 데이터가 String type일 경우엔 id 로 비교가 불가능해서 areItemsTheSame areContentsTheSame 구현이 동일할수밖에 없습니다.
data class를 하나 만드셔서 id 개념을 도입하시면 좀 더 최적화를 해보실수도 있으실거에요
|
||
fun addHistory(locationName: String) { | ||
repository.addHistory(locationName) | ||
_history.value = repository.getHistory() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(아직 안배우셨을거 같아서 대응하지 않으셔도 됩니다)
db에 쿼리를 날리는 작업은 대체로 오래 걸립니다.
지금도 쿼리가 실행되는 시간을 측정 해보시면 몇십~몇백ms정도는 나올거에요
이정도 눈깜빡할 시간도 UI 쓰레드에서 실행하면 유저에겐 버벅임으로 느껴질수 있습니다.
UI쓰레드를 방해하지 않을 방법을 한번 고민 해보시면 좋을거 같아요
코드 작성하면서 어려웠던 점
코드 리뷰 시, 멘토님이 중점적으로 리뷰해줬으면 하는 부분
먼저 MVVM을 정상적으로 적용하였는지가 궁금합니다!
다음으로 SQLite를 통해서 데이터를 저장, 삭제, 조회하는 과정에서, 불필요하거나 비효율적인 구현이 있는지 궁금합니다.
마지막으로 다양한 class를 구분하기 위해서 코드와 같이
model
,view
,viewmodel
의 package를 만들어서 관리했는데, 실제 앱들은 이를 어떻게 관리하는지가 궁금합니다!